#ifndef CLASSES_H
#define CLASSES_H

#include <vector>
#include <iostream>

//#include "inicializacao.h"



void gotoXY(int x,int y);

class XY
{
public:
    int x;
    int y;

    int g;
    int h; //para pathfind
    int f;

    int anterior;

    XY(int posX, int posY, int setG, int setH)
    {
        g = setG;
        h = setH;
        f = g+h;
        x=posX;
        y=posY;

    }
};

class SERHUMANO
{
public:
    int x,y;
    bool estaNaTela;

    std::vector <XY> caminho;

    int xDest,yDest;
    std::string imagem;
    std::string imagemSelec;
    bool selec;
    clock_t tempoMovimento;
    void defineDest(int posX, int posY)
    {
        xDest = posX;
        yDest = posY;
    }
    void mostrar(int xDoJogador, int yDoJogador)
    {
        gotoXY(x - xDoJogador , y - yDoJogador+1);
        if (selec)
            std::cout <<imagemSelec;
        else
            std::cout << imagem;
    }
};

class LIMITE
{
public:
    int x;
    int y;
    bool estaNaTela;
    std::string imagem;
    LIMITE(int posX, int posY)
    {
        imagem = "\033[40;32m▲";
        x=posX;
        y=posY;
    }
};

class ARVORE
{
public:
    int x;
    int y;
    int ID;
    bool estaNaTela;
    std::string imagem;
    int qtdDeMadeiraRestante;

    ARVORE(int xDes, int yDes, int IDdes)
    {
        x=xDes;
        y=yDes;
        ID=IDdes;
        imagem = "\033[40;32mT";
        qtdDeMadeiraRestante=30;
    }
};

class VACA
{
public:
    int x;
    int y;
    bool estaNaTela;
    std::string imagem;
    std::string imagemMorta;
    bool estaViva;
    int qtdDeComidaRestante;
    int ID;
    int tempoMovimento;

    VACA(int posX, int posY, int IDdes, clock_t tempoMovimentodes)
    {
        tempoMovimento = tempoMovimentodes;
        ID = IDdes;
        imagem = "\033[40;37m@";
        imagemMorta = "\033[41;37m@";
        estaViva = true;
        x=posX;
        y=posY;
        qtdDeComidaRestante=20;
    }
};

class CIDADAO : public SERHUMANO
{
public:
    int oQueFazendo;///0 = nada, 1 = arvore, 2 = vaca;
    bool recemEscolhido;
    CIDADAO(int posX, int posY)
    {
        tempoMovimento = clock();
        selec = false;
        imagem = "\033[40;35mP";
        imagemSelec ="\033[45;31mP";
        x=posX;
        xDest = x;
        y=posY;
        yDest =y;
    }
};

class ONIBUS
{
public:
    int x, y;
    bool selec;
    std::string imagemLinha1;
    std::string imagemLinha2;
    std::string imagemLinha3;
    std::string imagemSelecLinha1;
    std::string imagemSelecLinha2;
    std::string imagemSelecLinha3;
    ONIBUS(int xDes, int yDes)
    {
        x=xDes;
        y=yDes;
        selec = false;
        imagemLinha1 = "\033[40;33m╒═════╗";
        imagemLinha2 = "\033[40;33m║BUSÃO║";
        imagemLinha3 = "\033[40;33m╘═════╝";

        imagemSelecLinha1 = "\033[43;30m╒═════╗";
        imagemSelecLinha2 = "\033[43;30m║BUSÃO║";
        imagemSelecLinha3 = "\033[43;30m╘═════╝";
    }
    void mostrar(int xDoJogador, int yDoJogador)
    {

        gotoXY(x - xDoJogador,y - yDoJogador+1);
        std::cout <<((!selec) ? imagemLinha1 : imagemSelecLinha1);
        gotoXY(x - xDoJogador,y - yDoJogador+2);
        std::cout <<((!selec) ? imagemLinha2 : imagemSelecLinha2);
        gotoXY(x - xDoJogador,y - yDoJogador+3);
        std::cout <<((!selec) ? imagemLinha3 : imagemSelecLinha3);
    }
};
class BARRACK
{
public:
    int x, y;
    bool selec;
    std::string imagemLinha1;
    std::string imagemLinha2;
    std::string imagemLinha3;
    std::string imagemSelecLinha1;
    std::string imagemSelecLinha2;
    std::string imagemSelecLinha3;
    BARRACK (int xDes, int yDes)
    {
        x=xDes;
        y=yDes;
        selec = false;
        imagemLinha1 = "\033[40;33m┌──═──┐";
        imagemLinha2 = "\033[40;33m║LUTAR║";
        imagemLinha3 = "\033[40;33m└──═──┘";

        imagemSelecLinha1 = "\033[43;30m┌──═──┐";
        imagemSelecLinha2 = "\033[43;30m║LUTAR║";
        imagemSelecLinha3 = "\033[43;30m└──═──┘";
    }
    void mostrar(int xDoJogador, int yDoJogador)
    {
        gotoXY(x - xDoJogador,y - yDoJogador+1);
        std::cout <<((!selec) ? imagemLinha1 : imagemSelecLinha1);
        gotoXY(x - xDoJogador,y - yDoJogador+2);
        std::cout <<((!selec) ? imagemLinha2 : imagemSelecLinha2);
        gotoXY(x - xDoJogador,y - yDoJogador+3);
        std::cout <<((!selec) ? imagemLinha3 : imagemSelecLinha3);
    }
};

class GUERREIRO : public SERHUMANO
{
public:
    int oQueFazendo;
    bool recemEscolhido;
    GUERREIRO (int posX, int posY)
    {
        tempoMovimento = clock();
        selec = false;
        imagem = "\033[40;35mG";
        imagemSelec ="\033[45;31mG";
        x=posX;
        xDest = x;
        y=posY;
        yDest = y;
        caminho.clear();

    }

};

int criaObjeto (int x, int y, int queObjeto, std::vector<VACA> &vacas, std::vector<ARVORE> &arvores, std::vector<CIDADAO> &aldeoes, ONIBUS townCenter, std::vector <BARRACK> &barracas, std::vector <GUERREIRO> &guerreiro);

class MODOCONSTRUCAO
{
public:
    bool ligado;
    int queConstruindo;
    bool valido;
    void mostar(int posX, int posY)
    {
        switch (queConstruindo)
        {
        case 'z':
        {
            gotoXY(posX, posY);
            std::cout << "\033[44;42m┌──═──┐";
            gotoXY(posX, posY+1);
            std::cout << "\033[44;42m║LUTAR║";
            gotoXY(posX, posY+2);
            std::cout << "\033[44;42m└──═──┘";
            break;
        }
        }
    }
    int tentaConstruir(int xDes, int yDes, std::vector <VACA> &vacas, std::vector <ARVORE> &arvores ,std::vector <CIDADAO> &aldeoes, ONIBUS &townCenter, std::vector <BARRACK> &barracas, std::vector <GUERREIRO> &guerreiro)
    {
        switch (queConstruindo)
        {
        case 'z':
        {
            return criaObjeto(xDes,yDes,5,vacas,arvores,aldeoes,townCenter,barracas, guerreiro);
        }
        }
    }
};
//----------------------------------------------------------------- Mapa


#endif // CLASSES_H_INCLUDED
